package server

import (
	"fmt"
	"regexp"
	"sync"
)

// IPPool IP地址池管理器，用于管理和分配虚拟IP地址
type IPPool struct {
	availableIPs chan string
	mutex        sync.RWMutex
}

// NewIPPool 创建新的IP地址池
func NewIPPool() *IPPool {
	pool := &IPPool{
		availableIPs: make(chan string, 255),
	}
	pool.initializeIPs()
	return pool
}

// initializeIPs 初始化IP地址池 (127.0.1.1到127.0.1.255)
func (p *IPPool) initializeIPs() {
	for i := 1; i <= 255; i++ {
		ip := fmt.Sprintf("127.0.1.%d", i)
		p.availableIPs <- ip
	}
}

// AcquireIP 获取一个可用IP (阻塞直到有可用IP)
func (p *IPPool) AcquireIP() string {
	return <-p.availableIPs
}

// TryAcquireIP 尝试获取IP (非阻塞)
func (p *IPPool) TryAcquireIP() (string, bool) {
	select {
	case ip := <-p.availableIPs:
		return ip, true
	default:
		return "", false
	}
}

// ReleaseIP 释放IP地址，将其返回到池中
func (p *IPPool) ReleaseIP(ip string) {
	if p.isValidIP(ip) {
		select {
		case p.availableIPs <- ip:
		default:
			// 队列满了，忽略这个IP
		}
	}
}

// AvailableIPCount 获取当前可用IP数量
func (p *IPPool) AvailableIPCount() int {
	return len(p.availableIPs)
}

// isValidIP 验证IP地址格式是否符合要求 (127.0.1.x范围)
func (p *IPPool) isValidIP(ip string) bool {
	if ip == "" {
		return false
	}

	// 使用正则表达式验证IP地址格式
	matched, _ := regexp.MatchString(`^127\.0\.1\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$`, ip)
	return matched
}
